package service

import (
	"apitestAfterGo/dao"
	"apitestAfterGo/domain"
	"apitestAfterGo/dto"
	"gorm.io/gorm"
)

type taskService struct {
	GetAllTaskByPage func(dto dto.TaskInputDtoByPage) ([]domain.Task, int)
	DeleteTaskById   func(id int) bool
	AddTask          func(task domain.Task) domain.Task
	ModifyTaskById   func(task domain.Task) domain.Task
	GetTaskById      func(id int) domain.Task
}

var TaskServiceImpl taskService

func init() {
	TaskServiceImpl = taskService{
		GetAllTaskByPage: func(dto dto.TaskInputDtoByPage) ([]domain.Task, int) {
			dto.Current = (dto.Current - 1) * dto.PageSize
			var tasks []domain.Task
			dao.GormDb.Debug().Where("system_id = ? and task_name like ? and is_pigeonhole = 0", dto.SystemId, "%"+dto.TaskName+"%").Limit(dto.PageSize).Offset(dto.Current).Find(&tasks)
			var count int64
			dao.GormDb.Debug().Model(&domain.Task{}).Select("count(1)").Where("system_id = ?  and task_name like ? and is_pigeonhole = 0", dto.SystemId, "%"+dto.TaskName+"%").Count(&count)
			return tasks, int(count)
		},
		DeleteTaskById: func(id int) bool {
			dao.GormDb.Debug().Where("id = ?", id).Delete(&domain.Task{})
			return true
		},
		AddTask: func(task domain.Task) domain.Task {
			err := dao.GormDb.Transaction(func(tx *gorm.DB) error {
				// 在事务中执行一些 db 操作（从这里开始，您应该使用 'tx' 而不是 'db'）
				if err := tx.Create(&task).Error; err != nil {
					// 返回任何错误都会回滚事务
					return err
				}
				// 返回 nil 提交事务
				return nil
			})
			if err != nil {
				panic(err)
			}
			return task
		},
		ModifyTaskById: func(task domain.Task) domain.Task {
			dao.GormDb.Transaction(func(tx *gorm.DB) error {
				// 在事务中执行一些 db 操作（从这里开始，您应该使用 'tx' 而不是 'db'）
				if err := tx.Debug().Model(&task).Select("*").Omit("CreateBy", "CreatedAt").Updates(task).Error; err != nil {
					panic(err)
				}
				// 返回 nil 提交事务
				return nil
			})
			return task
		},
		GetTaskById: func(id int) domain.Task {
			var task domain.Task
			dao.GormDb.Debug().Model(&task).Where("id = ?", id).Find(&task)
			return task
		},
	}
}
